
### 项目二 LED 亮度的调节

**项目介绍：**

前面课程中，我们详细的介绍了通过代码控制LED亮灭，实现闪烁的效果。这节课我们使用PWM来控制LED亮度不断地变化，模拟我们呼吸的效果。

PWM是使用数字手段来控制模拟输出的一种手段。使用数字控制产生占空比不同的方波（一个不停在高电平与低电平之间切换的信号)来控制模拟输出。一般来说端口的输入电压只有两个0V与5V。如果想要改变灯的亮度怎么办呢个？有同学说串联电阻，对，这个方法是正确的。但是，如果想要得到不同的亮度，且在不同亮度之间来回变动怎么办呢？不可能不停地切换电阻吧。这种情况下就需要使用PWM了，那它是怎么控制的呢？

![image42](../media/a6dbf9a1d18d8849437f013dcaf2d4a6.png)

对于Arduino的数字端口电压输出只有LOW与HIGH两个，对应的就是0V与5V的电压输出，可以把LOW定义为0，HIGH定义为1，1秒内让Arduino输出500个0或者1的信号。如果这500个全部为1，那就是完整的5V，如果全部为0，那就是0V。如果010101010101这样输出，刚好一半，端口输出的平均电压就为2.5V了。这个和放映电影是一个道理，咱们所看的电影并不是完全连续的，它其实是每秒输出25张图片。在这种情况下，人的肉眼是分辨不出来的，看上去就是连续的了。PWM也是同样的道理，如果想要不同的电压，就控制0与1的输出比例控制就可以了。当然这和真实的连续输出还是有差别的，单位时间内输出的0,1信号越多，控制的就越精确。

**项目组件：**

| UNO R3 for 开发板\*1                                   | L298P 电机驱动扩展板 V1\*1                             | LED白发红模块\*1                                       |
|--------------------------------------------------------|--------------------------------------------------------|--------------------------------------------------------|
| ![image43](../media/67417bd98f12bffd0352f76063e5abbd.png) | ![image44](../media/3dca1bdd1d1420c1d12b16cbf52fee00.png) | ![image45](../media/31fb938502d3d519813c391569d6a3f3.png) |
| USB线\*1                                               | 3Pin 双母头杜邦线\*1                                   | 18650双节电池盒 (18650电池*2(电池自配))*1              |
| ![image46](../media/2adb48888136bedc4d6b37d47a47b292.jpg) | ![image47](../media/07752ebfc8e8af62f1b86c4a725ea284.jpg) | ![image48](../media/c5bf59a8e5cdded95c02334369ab6fdd.png) |

**接线图：**

**⚠️特别注意：坦克智能车已经组装好了，这里不需要把传感器模块和其他的都拆下来又重新组装和接线，这里再次提供接线图，是为了方便您编写代码。但是，LED灯是需要另外连接上去的！**

Arduino的PWM引脚在3，5，6，9，10，11,上一小节的接线刚刚好在9脚，所以我们这个接线不用变

![image49](../media/eb4e6d393edafbda78ae4cb3b58a961e.png)

**项目代码：**

**认识代码块**

① 这个代码块，表示当启动ESP32这块开发板时，将运行代码。

<figure>
![./media/img-20250609173755.png](../media/img-20250609173755.png)
<figcaption>Img</figcaption>
</figure>

② 创建变量。

![image50](../media/img-20250609174611.png)

这是创建“变量”的指令方块，可以声明“全局”或“局部”，还可以设置变量的类型、名称和赋值，item是变量名称。

![image51](../media/img-20250609174658.png)

获取变量item。

![image52](../media/img-20250609174714.png)

设置变量的值

![image53](../media/img-20250609174817.png)

设置变量item模式为每执行一次循环让item加1或每执行一次循环让item减1。

![image54](../media/img-20250609174841.png)

③ 循环语句，顾名思义就是重复做一件事。

![image55](../media/img-20250609173827.png)

④
有条件的循环控制语句，当满足循环次数时就退出循环，比如：10表示循环执行10次，数字10是可以改成其他数字的。

![image56](../media/img-20250609174945.png)

⑤
向LED指定引脚设置输出PWM值，只需要设置对应的引脚和模拟输出数值(0~255)，就可以输出PWM值）

![image57](../media/img-20250609175141.png)

⑥ 将程序的执行暂停一段时间，也就是延时。单位是秒。

![image58](../media/img-20250609174003.png)

**组合代码块**

（**特别提醒：在上传程序代码前，需要把蓝牙模块取下，否则代码会上传失败。需要上传代码成功后，再连接蓝牙模块。**）

![image59](../media/img-20250609175216.png)

**项目结果：**

代码下载完成后，我们可以看到LED会有个逐渐由亮到灭的一个缓慢过程，而不是直接的亮灭，如同呼吸一般，均匀变化。

**知识扩展：**

PWM是一项通过数字方法来获得模拟量的技术。数字控制来形成一个方波，方波信号只有开关两种状态（也就是我们数字引脚的高低）。通过控制开与关所持续时间的比值就能模拟到一个0到5V之间变化的电压。开（学术上称为高电平）所占用的时间就叫做脉冲宽度，所以PWM也叫做脉冲宽度调制。

通过下面五个方波来更形象的了解一下PWM。

![image60](../media/553f3d1b6ca04e1aa0479841dd075fa2.png)

**PWM示意图**

上图绿色竖线代表方波的一个周期。每个analogWrite(value)中写入的value都能对应一个百分比，这个百分比也称为占空比(Duty
Cycle)，指的是高电平在周期内占的时间比值，也就是：占空比=高电平时间
/周期时间。图中，从上往下，第一个方波，占空比为0%，对应的value为0。LED亮度最低，也就是灭的状态。高电平持续时间越长，也就越亮。所以，最后一个占空比为100%的对应value是255，LED最亮。50%就是最亮的一半了，25%则相对更暗。

PWM比较多的用于调节LED灯的亮度。或者是电机的转动速度，电机带动的车轮速度也就能很容易控制了，在玩一些Arduino机器人时，更能体现PWM的好处。

**项目拓展：**

我们不改变灯的脚位，只是改变程序里面 延时(delay)
的值，看看它如何改变渐变效果。

实验代码：

（**特别提醒：在上传程序代码前，需要把蓝牙模块取下，否则代码会上传失败。需要上传代码成功后，再连接蓝牙模块。**）

![image61](../media/img-20250609175317.png)

上传代码到开发板，看LED渐变的效果是不是慢了一些。